1 Introduction: Mapping of broad research field around EIST in v2

Here are preliminary results of the bibliometric mapping of EIST. Its purpose is:

The method for the research-field-mapping can be reviewed here:

Rakas, M., & Hain, D. S. (2019). The state of innovation system research: What happens beneath the surface?. Research Policy, 48(9), 103787.

Note: The analysis in this document depicts the larger research field around the department, thereby all analysis results are based on the publications of the department plus related

—>

2 General Overview over the research field

Note: This section provides basic descriptives of th identified research fielld, including number of articles over time, countries, institutions, and authors. See Technical descriptionfor additional explanations.

2.1 Main Indicators: Publications, Authors, Countries

2.2 Connection between the research field’s Top Authors-Keywords-Journals

3 Topic modelling

Note: Here, we report the results of a LDA topic-modelling (basically, clustering on words) on all title+abstract texts. Identified topics can be interpreted as broad themes in the research field. See Technical descriptionfor additional explanations.

3.1 Topics by topwords

Note: While this static vies is helpful, I recommend using the interactive LDAVis version to be found under https://daniel-hain.github.io/biblio_lux_2022/output/topic_modelling/LDAviz_eist_v2/index.html#topic=1&lambda=0.60&term=. For functionality and usage, see ´Technical ´.

4 Knowledge Bases: Co-Citation network analysis

Note: This analysis refers the co-citation analysis, where the cited references and not the original publications are the unit of analysis. Identified knowledge bases can be interpreted as the knowledge foundation the field draws from. See Technical descriptionfor additional explanations.

5 Research Areas: Bibliographic coupling analysis

Note: This analysis refers the bibliographic coupling analysis, where original publications are the unit of analysis. Identified research areas can be interpreted as the field’s current research frontier. See Technical descriptionfor additional explanations.

6 Knowledge Bases, Research Areas & Topics Interaction

6.1 Joint Overview over Knowledge Bases, Research Areas, and Topics

This plot shows the connection of publications in the research areas to knowledge bases (by citations) and topics (by gamma, document-topic weight)

8 Collaboration

R version 4.2.1 (2022-06-23)
Platform: x86_64-apple-darwin17.0 (64-bit)
Running under: macOS Ventura 13.1

Matrix products: default
LAPACK: /Library/Frameworks/R.framework/Versions/4.2/Resources/lib/libRlapack.dylib

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] directlabels_2021.1.13 RColorBrewer_1.1-3     topicmodels_0.2-12     patchwork_1.1.2        ggrepel_0.9.1         
 [6] ggforce_0.4.1          plotly_4.10.1          widyr_0.1.5            kableExtra_1.3.4       knitr_1.40            
[11] tidytext_0.3.4         ggraph_2.1.0           tidygraph_1.2.2        bibliometrix_4.1.0     magrittr_2.0.3        
[16] forcats_0.5.2          stringr_1.4.1          dplyr_1.0.10           purrr_0.3.5            readr_2.1.3           
[21] tidyr_1.2.1            tibble_3.1.8           ggplot2_3.4.0          tidyverse_1.3.2       

loaded via a namespace (and not attached):
  [1] readxl_1.4.1           backports_1.4.1        servr_0.25             systemfonts_1.0.4      plyr_1.8.8            
  [6] igraph_1.3.5           lazyeval_0.2.2         crosstalk_1.2.0        SnowballC_0.7.0        digest_0.6.30         
 [11] htmltools_0.5.3        viridis_0.6.2          fansi_1.0.3            tm_0.7-9               googlesheets4_1.0.1   
 [16] cluster_2.1.3          tzdb_0.3.0             openxlsx_4.2.5.1       graphlayouts_0.8.3     modelr_0.1.9          
 [21] vroom_1.6.0            svglite_2.1.0          colorspace_2.0-3       rvest_1.0.3            pubmedR_0.0.3         
 [26] haven_2.5.1            xfun_0.34              crayon_1.5.2           jsonlite_1.8.3         bibliometrixData_0.3.0
 [31] glue_1.6.2             polyclip_1.10-4        gtable_0.3.1           gargle_1.2.1           emmeans_1.8.2         
 [36] webshot_0.5.4          rentrez_1.2.3          scales_1.2.1           mvtnorm_1.1-3          DBI_1.1.3             
 [41] Rcpp_1.0.9             viridisLite_0.4.1      xtable_1.8-4           dimensionsR_0.0.3      flashClust_1.01-2     
 [46] bit_4.0.5              stats4_4.2.1           DT_0.26                htmlwidgets_1.5.4      httr_1.4.4            
 [51] ellipsis_0.3.2         modeltools_0.2-23      factoextra_1.0.7       pkgconfig_2.0.3        XML_3.99-0.12         
 [56] farver_2.1.1           multcompView_0.1-8     sass_0.4.2             dbplyr_2.2.1           utf8_1.2.2            
 [61] reshape2_1.4.4         tidyselect_1.2.0       labeling_0.4.2         rlang_1.0.6            later_1.3.0           
 [66] munsell_0.5.0          cellranger_1.1.0       tools_4.2.1            cachem_1.0.6           cli_3.4.1             
 [71] generics_0.1.3         broom_1.0.1            evaluate_0.17          fastmap_1.1.0          yaml_2.3.6            
 [76] bit64_4.0.5            fs_1.5.2               zip_2.2.2              mime_0.12              slam_0.1-50           
 [81] leaps_3.1              xml2_1.3.3             tokenizers_0.2.3       compiler_4.2.1         rstudioapi_0.14       
 [86] reprex_2.0.2           tweenr_2.0.2           bslib_0.4.0            stringi_1.7.8          highr_0.9             
 [91] lattice_0.20-45        Matrix_1.5-1           vctrs_0.5.1            stringdist_0.9.10      pillar_1.8.1          
 [96] lifecycle_1.0.3        rscopus_0.6.6          jquerylib_0.1.4        estimability_1.4.1     data.table_1.14.4     
[101] httpuv_1.6.6           R6_2.5.1               promises_1.2.0.1       gridExtra_2.3          janeaustenr_1.0.0     
[106] MASS_7.3-57            assertthat_0.2.1       withr_2.5.0            parallel_4.2.1         hms_1.1.2             
[111] quadprog_1.5-8         grid_4.2.1             rmarkdown_2.17         googledrive_2.0.0      NLP_0.2-1             
[116] scatterplot3d_0.3-42   shiny_1.7.3            lubridate_1.8.0        FactoMineR_2.6        

8.1 Collaboration network

9 Endnotes

LS0tCnRpdGxlOiAiTHV4ZW1ib3VyZyBSZXNlYXJjaCBFdmFsdWF0aW9uIDIwMjI6IEZpZWxkIE1hcHBpbmcgb2YgS25vd2xlZGdlIFN0cnVjdHVyZSIKYXV0aG9yOiAiRGFuaWVsIFMuIEhhaW4iCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkICVCLCAlWScpYCIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICB0aGVtZTogZmxhdGx5CiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIGRmX3ByaW50OiBwYWdlZAogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgICB0b2M6IGZhbHNlCiAgICB0b2NfZGVwdGg6IDMKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiBmYWxzZQpwYXJhbXM6CiAgICBpbnN0aXR1dGU6IAogICAgICAgdmFsdWU6IG51bGwKICAgIGRlcGFydG1lbnQ6CiAgICAgICB2YWx1ZTogbnVsbAotLS0KCjwhLS0tCiMgQWRkIHRvIFlBTUwgd2hlbiBjb21waWxpbmcgaHRtbCAtLTwgd2hlbiByZXZpZXdpbmcgY2hhbmdlIGZpcnN0IGxpbmUgdG86IGh0bWxfbm90ZWJvb2sKICBodG1sX2RvY3VtZW50OgogICAgdGhlbWU6IGZsYXRseQogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICBkZl9wcmludDogcGFnZWQKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgdG9jOiBmYWxzZQogICAgdG9jX2RlcHRoOiAzCiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogZmFsc2UKCiMgQWRkIHdoZW4gY29tcGlsaW5nIHBkZgojIEFkZCB0byBZQU1MIHdoZW4gY29tcGlsaW5nIGh0bWwKICAgYm9va2Rvd246OnBkZl9kb2N1bWVudDI6IAogICAgZmlnX2NhcHRpb246IHRydWUKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgZ2xvYmFsX251bWJlcmluZzogdHJ1ZQotLS0+CgoKYGBgez1odG1sfQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoubWFpbi1jb250YWluZXIgewogIG1heC13aWR0aDogMTIwMHB4OwogIG1hcmdpbi1sZWZ0OiBhdXRvOwogIG1hcmdpbi1yaWdodDogYXV0bzsKfQo8L3N0eWxlPgpgYGAKCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQojIyMgR2VuZXJpYyBwcmVhbWJsZQojcm0obGlzdD1scygpKQpTeXMuc2V0ZW52KExBTkcgPSAiZW4iKQpvcHRpb25zKHNjaXBlbiA9IDUpCnNldC5zZWVkKDEzMzcpCgojIyMgTG9hZCBwYWNrYWdlcyAgCiMgZ2VuZXJhbApsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShtYWdyaXR0cikKbGlicmFyeSh3aWR5cikKCiMgS2libGlvICYgTlcKbGlicmFyeShiaWJsaW9tZXRyaXgpCmxpYnJhcnkodGlkeWdyYXBoKQpsaWJyYXJ5KGdncmFwaCkKCiMgTkxQCmxpYnJhcnkodGlkeXRleHQpCgojIERhdGF2aXoKbGlicmFyeShwbG90bHkpCmxpYnJhcnkoZ2dmb3JjZSkKbGlicmFyeShnZ3JlcGVsKQpsaWJyYXJ5KHBhdGNod29yaykKCiMgS25pdApsaWJyYXJ5KGtuaXRyKSAjIEZvciBkaXNwbGF5IG9mIHRoZSBtYXJrZG93bgpsaWJyYXJ5KGthYmxlRXh0cmEpICMgRm9yIHRhYmxlIHN0eWxpbmcKCiMgb3duIGZ1bmN0aW9ucwpzb3VyY2UoIi4uL2Z1bmN0aW9ucy9mdW5jdGlvbnNfYmFzaWMuUiIpCnNvdXJjZSgiLi4vZnVuY3Rpb25zL2Z1bmN0aW9uc19zdW1tYXJ5LlIiKQpzb3VyY2UoIi4uL2Z1bmN0aW9ucy8wMF9wYXJhbWV0ZXJzLlIiKQoKIyBLbml0ciBvcHRpb25zCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UsIAogICAgICAgICAgICAgICAgICAgICAgd2FybmluZyA9IEZBTFNFLCAKICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBGQUxTRSkKYGBgCgo8IS0tICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAtLT4KPCEtLSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLS0+CjwhLS0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgTkVYVCBQQVJUICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC0tPgo8IS0tICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAtLT4KPCEtLSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLS0+CgpgYGB7ciwgaW5jbHVkZT1GQUxTRX0KIyBXaGVuIGRvaW5nIGl0IGhlcmUgaW4gdGhlIG5vdGVib29rCnZhcl9pbnN0IDwtICdFSVNUJwp2YXJfZGVwdCA8LSAndjInCgojIFdoZW4gY2FsbGluZyBmcm9tIGEgaGlnaGVydCBsZXZlbCBzY3JpcHQKI3Zhcl9pbnN0IDwtIHBhcmFtcyRpbnN0aXR1dGUKI3Zhcl9kZXB0IDwtIHBhcmFtcyRkZXBhcnRtZW50CmBgYAoKIyBJbnRyb2R1Y3Rpb246IE1hcHBpbmcgb2YgYnJvYWQgcmVzZWFyY2ggZmllbGQgYXJvdW5kIGByIHZhcl9pbnN0YCBpbiBgciB2YXJfZGVwdGAKCkhlcmUgYXJlIHByZWxpbWluYXJ5IHJlc3VsdHMgb2YgdGhlIGJpYmxpb21ldHJpYyBtYXBwaW5nIG9mIEVJU1QuIEl0cyBwdXJwb3NlIGlzOgoKKiBUbyBtYXAgdGhlIGJyb2FkZXIgcmVzZWFyY2ggY29tbXVuaXR5IGFuZCBkaXN0aW5jdCByZXNlYXJjaCBmaWVsZCB0aGUgZGVwYXJ0bWVudCBjb250cmlidXRlcyB0by4KKiBJZGVudGlmeSBjb3JlIGtub3dsZWRnZSBiYXNlcywgcmVzZWFyY2ggYXJlYXMgZ3RyZW5kcyBhbmQgdG9waWNzLgoqIEhpZ2hsaWdodCB0aGUgcG9zaXRpb25pbmcgb2YgdGhlIGRlcGFydG1lbnQgd2l0aGluIHRoaXMgZHluYW1pY3MuCgpUaGUgbWV0aG9kIGZvciB0aGUgcmVzZWFyY2gtZmllbGQtbWFwcGluZyBjYW4gYmUgcmV2aWV3ZWQgaGVyZToKCltSYWthcywgTS4sICYgSGFpbiwgRC4gUy4gKDIwMTkpLiBUaGUgc3RhdGUgb2YgaW5ub3ZhdGlvbiBzeXN0ZW0gcmVzZWFyY2g6IFdoYXQgaGFwcGVucyBiZW5lYXRoIHRoZSBzdXJmYWNlPy4gUmVzZWFyY2ggUG9saWN5LCA0OCg5KSwgMTAzNzg3Ll0oaHR0cHM6Ly9kb2kub3JnLzEwLjEwMTYvai5yZXNwb2wuMjAxOS4wNC4wMTEpCgoqKk5vdGU6KiogVGhlIGFuYWx5c2lzIGluIHRoaXMgZG9jdW1lbnQgZGVwaWN0cyB0aGUgKmxhcmdlciByZXNlYXJjaCBmaWVsZCogYXJvdW5kIHRoZSBkZXBhcnRtZW50LCB0aGVyZWJ5IGFsbCBhbmFseXNpcyByZXN1bHRzIGFyZSBiYXNlZCBvbiB0aGUgcHVibGljYXRpb25zIG9mIHRoZSBkZXBhcnRtZW50IHBsdXMgcmVsYXRlZCAKCgo8IS0tICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAtLT4KPCEtLSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLS0+CjwhLS0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgTkVYVCBQQVJUICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC0tPgo8IS0tICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAtLT4KPCEtLSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLS0+CgpgYGB7ciwgaW5jbHVkZT1GQUxTRX0KIyBMb2FkIGRhdGEKTSA8LSByZWFkUkRTKHBhc3RlMCgnLi4vLi4vdGVtcC9NXycsIHN0cl90b19sb3dlcih2YXJfaW5zdCksICdfJywgc3RyX3RvX2xvd2VyKHZhcl9kZXB0KSwgJy5yZHMnKSkgJT4lIGFzX3RpYmJsZSgpICU+JSAKICBkaXN0aW5jdChVVCwgLmtlZXBfYWxsID0gVFJVRSkgJT4lIAogIGZpbHRlcihQWSA+PSBQWV9taW4sIFBZIDw9IFBZX21heCkgJT4lCiAgZ3JvdXBfYnkoUFkpICU+JQogICAgbXV0YXRlKFRDX2NvaG9ydF9yYW5rID0gcGVyY2VudF9yYW5rKFRDKSkgJT4lCiAgdW5ncm91cCgpIApgYGAKCmBgYHtyfQpjb21fbGFiZWxzIDwtIHJlYWRfY3N2MignLi4vZGF0YS9jb21tdW5pdHlfbGFiZWxpbmcuY3N2JykgICU+JSBmaWx0ZXIoaW5zdGl0dXRlID09IHZhcl9pbnN0LCBkZXBhcnRtZW50ID09IHZhcl9kZXB0KSAlPiUgYXJyYW5nZShpbnN0aXR1dGUsIGRlcGFydG1lbnQsIHR5cGUsIGNvbSkgJT4lIG11dGF0ZShsYWJlbCA9IGlmZWxzZShpcy5uYShsYWJlbCksIHBhc3RlMCh0eXBlLCAnICcsIGNvbSwgJzogdW5sYWJlbGVkJyksIHBhc3RlMCh0eXBlLCAnICcsIGNvbSwgJzogJywgbGFiZWwpKSkKYGBgCjwhLS0tCiMgU2VlZCBBcnRpY2xlcwoKKipOb3RlOioqIFRoZSBzZWVkIGFydGljbGVzIGRlZW1lZCByZXByZXNlbnRhdGl2ZSBmb3IgdGhlIGFjdGl2ZSBhcmVhcyBvZiByZXNlYXJjaCBpbiB0aGUgaW5zdGl0dXRpb24sIGFuZCBpbmNsdWRlIGF1dGhvcnMgYWZmaWxpYXRlZCB3aXRoIHRoZSBpbnN0aXR1dGlvbi4gVGhlIGRlcGFydG1lbnRzIHJlc2VhcmNoIGZpZWxkIGlzIGlkZW50aWZpZWQgYnkgc2VsZWN0aW5nIHRoZSAyMDAwIG1vc3Qgc2ltaWxhciBwdWJsaWNhdGlvbnMgdG8gdGhlIHNlbGVjdGVkIHNlZWQgYXJ0aWNsZXMuIFNlZSBgVGVjaG5pY2FsIGRlc2NyaXB0aW9uYGZvciBhZGRpdGlvbmFsIGV4cGxhbmF0aW9ucy4KCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQpzZWVkIDwtY29udmVydDJkZihmaWxlID0gcGFzdGUwKCcuLi8uLi9kYXRhL3NlZWRzL3Njb3B1c18nLCBzdHJfdG9fbG93ZXIodmFyX2luc3QpLCAnXycsIHN0cl90b19sb3dlcih2YXJfZGVwdCksICdfc2VlZF9zZWxlY3QuY3N2JyksIGRic291cmNlID0gInNjb3B1cyIsIGZvcm1hdCA9ICJjc3YiKSAlPiUKICBhc190aWJibGUoKSAlPiUKICBtdXRhdGUoc2VlZCA9IFRSVUUpIApgYGAKCmBgYHtyfQpzZWVkICU+JQogIHNlbGVjdChBVSwgUFksIFRJLCBKSSkgJT4lCiAgbXV0YXRlKEFVID0gQVUgJT4lIHN0cl90cnVuYygzMCksCiAgICAgICAgIFRJID0gVEkgJT4lIHN0cl90cnVuYygxMDApLAogICAgICAgICBKSSA9IEpJICU+JSBzdHJfdHJ1bmMoMzApKSAlPiUKICBrYWJsZSgpICU+JQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiksIGZvbnRfc2l6ZSA9IDEwKQpgYGAKCi0tLT4KCiMgR2VuZXJhbCBPdmVydmlldyBvdmVyIHRoZSByZXNlYXJjaCBmaWVsZAoKKipOb3RlOioqIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBiYXNpYyBkZXNjcmlwdGl2ZXMgb2YgdGggaWRlbnRpZmllZCByZXNlYXJjaCBmaWVsbGQsIGluY2x1ZGluZyBudW1iZXIgb2YgYXJ0aWNsZXMgb3ZlciB0aW1lLCBjb3VudHJpZXMsIGluc3RpdHV0aW9ucywgYW5kIGF1dGhvcnMuIFNlZSBgVGVjaG5pY2FsIGRlc2NyaXB0aW9uYGZvciBhZGRpdGlvbmFsIGV4cGxhbmF0aW9ucy4KCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQojIHJlc3VsdHMgPC0gYmlibGlvQW5hbHlzaXMoTSwgc2VwID0gIjsiKQpyZXN1bHRzIDwtIHJlYWRfcmRzKHBhc3RlMCgnLi4vLi4vdGVtcC9NX3Jlc18nLCBzdHJfdG9fbG93ZXIodmFyX2luc3QpLCAnXycsIHN0cl90b19sb3dlcih2YXJfZGVwdCksICcucmRzJykpCmBgYAoKIyMgTWFpbiBJbmRpY2F0b3JzOiBQdWJsaWNhdGlvbnMsIEF1dGhvcnMsIENvdW50cmllcyAKCmBgYHtyfQojcmVzdWx0cyAlPiUgcGxvdChrID0gMTAsIHBhdXNlID0gRkFMU0UpCmBgYAoKYGBge3J9CnByb2RfQVUgPC0gTSAlPiUgYXV0aG9yUHJvZE92ZXJUaW1lKGsgPSAxMCwgZ3JhcGggPSBUUlVFKQojcGxvdChwcm9kX0FVJGdyYXBoKQpgYGAKCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQpybShyZXN1bHRzLCBwcm9kX0FVKQpgYGAKCiMjIENvbm5lY3Rpb24gYmV0d2VlbiB0aGUgcmVzZWFyY2ggZmllbGQncyBUb3AgQXV0aG9ycy1LZXl3b3Jkcy1Kb3VybmFscwoKYGBge3IsIGluY2x1ZGU9RkFMU0V9Ck1fdGhyZWVmaWVsZCA8LSByZWFkUkRTKHBhc3RlMCgnLi4vLi4vdGVtcC90aHJlZWZpZWxkXycsIHN0cl90b19sb3dlcih2YXJfaW5zdCksICdfJywgc3RyX3RvX2xvd2VyKHZhcl9kZXB0KSwgJy5yZHMnKSkgCmBgYAoKYGBge3IsIGZpZy53aWR0aD0xNy41LCBmaWcuaGVpZ2h0PTE3LjV9Ck1fdGhyZWVmaWVsZApgYGAKCiMgVG9waWMgbW9kZWxsaW5nIAoKKipOb3RlOioqIEhlcmUsIHdlIHJlcG9ydCB0aGUgcmVzdWx0cyBvZiBhIExEQSB0b3BpYy1tb2RlbGxpbmcgKGJhc2ljYWxseSwgY2x1c3RlcmluZyBvbiB3b3Jkcykgb24gYWxsIHRpdGxlK2Fic3RyYWN0IHRleHRzLiBJZGVudGlmaWVkIHRvcGljcyBjYW4gYmUgaW50ZXJwcmV0ZWQgYXMgYnJvYWQgdGhlbWVzIGluIHRoZSByZXNlYXJjaCBmaWVsZC4gU2VlIGBUZWNobmljYWwgZGVzY3JpcHRpb25gZm9yIGFkZGl0aW9uYWwgZXhwbGFuYXRpb25zLgoKYGBge3IsIGluY2x1ZGU9RkFMU0V9CnRleHRfdGlkeSA8LSByZWFkUkRTKHBhc3RlMCgnLi4vLi4vdGVtcC90ZXh0X3RpZHlfJywgc3RyX3RvX2xvd2VyKHZhcl9pbnN0KSwgJ18nLCBzdHJfdG9fbG93ZXIodmFyX2RlcHQpLCAnLnJkcycpKQp0ZXh0X2xkYSA8LSByZWFkUkRTKHBhc3RlMCgnLi4vLi4vdGVtcC90ZXh0X0xEQV8nLCBzdHJfdG9fbG93ZXIodmFyX2luc3QpLCAnXycsIHN0cl90b19sb3dlcih2YXJfZGVwdCksICcucmRzJykpIAoKdGV4dF9sZGFfYmV0YSA8LSB0ZXh0X2xkYSAlPiUgdGlkeShtYXRyaXggPSAiYmV0YSIpIAp0ZXh0X2xkYV9nYW1tYSA8LSB0ZXh0X2xkYSAlPiUgdGlkeShtYXRyaXggPSAiZ2FtbWEiKQpgYGAKCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQpjb21fbmFtZXNfdG9wIDwtIHRpYmJsZSggCiAgY29tID0gMToodGV4dF9sZGFfZ2FtbWEgJT4lIHB1bGwodG9waWMpICU+JSBuX2Rpc3RpbmN0KCkpLAogIHR5cGUgPSAnVFAnLAogIGNvbCA9IGNvbSAlPiUgZ2dfY29sb3Jfc2VsZWN0KHBhbCA9IHBhbF90cCkpICU+JQogIGxlZnRfam9pbihjb21fbGFiZWxzICU+JSBmaWx0ZXIodHlwZSA9PSAnVFAnKSAlPiUgc2VsZWN0KGNvbSwgbGFiZWwpLCBieSA9ICdjb20nKSAlPiUKICBtdXRhdGUobGFiZWwgPSBpZmVsc2UoaXMubmEobGFiZWwpLCBwYXN0ZTAoJ1RQICcsIGNvbSwgJzogdW5sYWJlbGVkJyksIGxhYmVsKSkKICAgICAgICAgICAgCiMgIyAxc3QgYWx0ZXJuYXRpdmU6IE51bWJlciB0aGVtIDEtbgojIHBhc3RlKHR5cGUsIDE6KHRleHRfbGRhX2dhbW1hICU+JSBwdWxsKHRvcGljKSAlPiUgbl9kaXN0aW5jdCgpKSkgICAgICAgICAgIApgYGAKCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQp0ZXh0X2xkYV9iZXRhICU8PiUgIGlubmVyX2pvaW4oY29tX25hbWVzX3RvcCAlPiUgc2VsZWN0KGNvbSwgbGFiZWwsIGNvbCksIGJ5ID0gYygndG9waWMnID0gJ2NvbScpKQp0ZXh0X2xkYV9nYW1tYSAlPD4lIGlubmVyX2pvaW4oY29tX25hbWVzX3RvcCAlPiUgc2VsZWN0KGNvbSwgbGFiZWwsIGNvbCksIGJ5ID0gYygndG9waWMnID0gJ2NvbScpKQpgYGAKCgojIyBUb3BpY3MgYnkgdG9wd29yZHMKCmBgYHtyLCBmaWcud2lkdGg9MTUsIGZpZy5oZWlnaHQ9MTV9IAp0ZXh0X2xkYV9iZXRhICU+JQogIGdyb3VwX2J5KGxhYmVsKSAlPiUKICBzbGljZV9tYXgoYmV0YSwgbiA9IDEwKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKHRlcm0gPSByZW9yZGVyX3dpdGhpbih0ZXJtLCBiZXRhLCBsYWJlbCkpICU+JQogIGdncGxvdChhZXModGVybSwgYmV0YSwgZmlsbCA9IGZhY3RvcihsYWJlbCkpKSArCiAgZ2VvbV9jb2woc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGZhY2V0X3dyYXAofiBsYWJlbCwgc2NhbGVzID0gImZyZWUiLCBuY29sID0gMykgKwogIGNvb3JkX2ZsaXAoKSArCiAgc2NhbGVfeF9yZW9yZGVyZWQoKSArCiAgbGFicyh4ID0gIkludHJhLXRvcGljIGRpc3RyaWJ1dGlvbiBvZiB3b3JkIiwKICAgICAgIHkgPSAiV29yZHMgaW4gdG9waWMiKSArIAogIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWUgPSAiTGVnZW5kIiwgdmFsdWVzID0gY29tX25hbWVzX3RvcCAlPiUgcHVsbChjb2wpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ2JvdHRvbScpCgojcGxvdF9seSA8LSBwbG90ICU+JSBwbG90bHk6OmdncGxvdGx5KCkKI2h0bWx3aWRnZXRzOjpzYXZlV2lkZ2V0KHBsb3RseTo6YXNfd2lkZ2V0KHBsb3RfbHkpLCAnLi4vb3V0cHV0XHZpc19wbG90bHlfdG9waWNfdGVybXMuaHRtbCcsIHNlbGZjb250YWluZWQgPSBUUlVFKQpgYGAKCioqTm90ZToqKiBXaGlsZSB0aGlzIHN0YXRpYyB2aWVzIGlzIGhlbHBmdWwsIEkgcmVjb21tZW5kIHVzaW5nIHRoZSBpbnRlcmFjdGl2ZSBMREFWaXMgdmVyc2lvbiB0byBiZSBmb3VuZCB1bmRlciBgciBwYXN0ZTAoJ2h0dHBzOi8vZGFuaWVsLWhhaW4uZ2l0aHViLmlvL2JpYmxpb19sdXhfMjAyMi9vdXRwdXQvdG9waWNfbW9kZWxsaW5nL0xEQXZpel8nLCBzdHJfdG9fbG93ZXIodmFyX2luc3QpLCAnXycsIHN0cl90b19sb3dlcih2YXJfZGVwdCksICcvaW5kZXguaHRtbCN0b3BpYz0xJmxhbWJkYT0wLjYwJnRlcm09JylgLiBGb3IgZnVuY3Rpb25hbGl0eSBhbmQgdXNhZ2UsIHNlZSDCtFRlY2huaWNhbCDCtC4KCmBgYHtyLCBmaWcud2lkdGggPSAxNSwgZmlnLmhlaWdodD03LjV9CnRleHRfbGRhX2dhbW1hICU+JQogIHJlbmFtZSh3ZWlnaHQgPSBnYW1tYSkgJT4lCiAgbGVmdF9qb2luKE0gJT4lIHNlbGVjdChYWCwgUFkpLCBieSA9IGMoJ2RvY3VtZW50JyA9ICdYWCcpKSAlPiUKICBtdXRhdGUoUFkgPSBhcy5udW1lcmljKFBZKSkgJT4lCiAgZ3JvdXBfYnkoUFksIGxhYmVsKSAlPiUgc3VtbWFyaXNlKHdlaWdodCA9IHN1bSh3ZWlnaHQpKSAlPiUgdW5ncm91cCgpICU+JQogIGdyb3VwX2J5KFBZKSAlPiUgbXV0YXRlKHdlaWdodF9QWSA9IHN1bSh3ZWlnaHQpKSAlPiUgdW5ncm91cCgpICU+JQogIG11dGF0ZSh3ZWlnaHRfcmVsID0gd2VpZ2h0IC8gd2VpZ2h0X1BZKSAlPiUKICBzZWxlY3QoUFksIGxhYmVsLCB3ZWlnaHQsIHdlaWdodF9yZWwpICU+JQogIGZpbHRlcihQWSA+PSBQWV9taW4gJiBQWSA8PSBQWV9tYXgpICU+JQogIGFycmFuZ2UoUFksIGxhYmVsKSAlPiUKICBwbG90X3N1bW1hcnlfdGltZWxpbmUoeTEgPSB3ZWlnaHQsIHkyID0gd2VpZ2h0X3JlbCwgdCA9IFBZLCB0X21pbiA9IFBZX21pbiwgdF9tYXggPSBQWV9tYXgsIGJ5ID0gbGFiZWwsICBsYWJlbCA9IFRSVUUsIHBhbCA9IHBhbF90cCwgCiAgICAgICAgICAgICAgICAgICAgICAgIHkxX3RleHQgPSAiVG9waWMgcG9wdWxhcml0eSBhbm51YWx5IiwgeTJfdGV4dCA9ICJTaGFyZSBvZiB0b3BpYyBhbm51YWxseSIpICsKICBwbG90X2Fubm90YXRpb24odGl0bGUgPSBwYXN0ZSgnVG9waWMgTW9kZWxsaW5nOicsIHZhcl9pbnN0LCAnRmllbGQgYXJvdW5kIERlcHQuJywgdmFyX2RlcHQsIHNlcCA9ICcgJyksCiAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gcGFzdGUoJ1RpbWVmcmFtZTonLCBQWV9taW4sICctJywgUFlfbWF4ICwgc2VwID0gJyAnKSwKICAgICAgICAgICAgICAgICAgY2FwdGlvbiA9ICdBYnNvbHV0ZSB0b3BpYyBhcHBlYXJhbmNlIChsZWZ0KSwgUmVsYXRpdmUgdG9waWMgYXBwZWFyYW5jZSAocmlnaHQpJykKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMTUsIGZpZy5oZWlnaHQ9Ny41fQp0ZXh0X2xkYV9nYW1tYSAlPiUKICByZW5hbWUod2VpZ2h0ID0gZ2FtbWEpICU+JQogIGlubmVyX2pvaW4oTSAlPiUgc2VsZWN0KFhYLCBQWSwgVENfY29ob3J0X3JhbmspICU+JQogICAgICAgICAgICAgIGZpbHRlcihpbnRfZGVwdCA9IFRSVUUpLCBieSA9IGMoJ2RvY3VtZW50JyA9ICdYWCcpKSAlPiUKICAjIG11dGF0ZShpbXBhY3QgPSB3ZWlnaHQqIFRDX2NvaG9ydF9yYW5rKSAlPiUKICBtdXRhdGUoaW1wYWN0ID0gVENfY29ob3J0X3JhbmsgPj0gMC45KSAlPiUKICBncm91cF9ieShQWSkgJT4lCiAgZmlsdGVyKHBlcmNlbnRfcmFuayh3ZWlnaHQpID49IDAuNSkgJT4lCiAgdW5ncm91cCgpICU+JQogIGdyb3VwX2J5KGxhYmVsLCBQWSkgJT4lCiAgc3VtbWFyaXNlKGltcGFjdCA9IG1lYW4oaW1wYWN0KSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gUFksIHkgPSBpbXBhY3QsIGNvbCA9IGxhYmVsKSkgKwogIGdlb21fbGluZSgpICsgCiAgZ2VvbV9wb2ludCgpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ2JvdHRvbScpICsKICBsYWJzKHRpdGxlID0gcGFzdGUoJ1RvcGljIEltcGFjdDonLCB2YXJfaW5zdCwgJ0ZpZWxkIGFyb3VuZCBEZXB0LicsIHZhcl9kZXB0LCBzZXAgPSAnICcpLAogICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9IHBhc3RlKCdUaW1lZnJhbWU6JywgUFlfbWluLCAnLScsIFBZX21heCAsIHNlcCA9ICcgJyksCiAgICAgICAgICAgICAgICAgIHggPSAnWWVhcicsCiAgICAgICAgICAgICAgICAgIHkgPSAnVG9waWMgSW1wYWN0JywKICAgICAgICAgICAgICAgICAgY2FwdGlvbiA9ICdUb3BpYyBJbXBhY3QgcmVmZXJzIHRvIHRoZSBzaGFyZSBvZiBwdWJsaWNhdGlvbnMgd2l0aGluIHRoZSBjb2hvcnQgdG9wLTEwJSBjaXRlZCBwdWJsaWNhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSB0b3BpYycsCiAgICAgICAgICAgICAgICAgICkKYGBgCgo8IS0tICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAtLT4KPCEtLSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLS0+CjwhLS0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgTkVYVCBQQVJUICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC0tPgo8IS0tICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAtLT4KPCEtLSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLS0+CgoKYGBge3IsIGluY2x1ZGU9RkFMU0V9CnJtKHRleHRfdGlkeSwgdGV4dF9sZGEpCmBgYAoKIyBLbm93bGVkZ2UgQmFzZXM6IENvLUNpdGF0aW9uIG5ldHdvcmsgYW5hbHlzaXMgCgoqKk5vdGU6KiogVGhpcyBhbmFseXNpcyByZWZlcnMgdGhlIGNvLWNpdGF0aW9uIGFuYWx5c2lzLCB3aGVyZSB0aGUgY2l0ZWQgcmVmZXJlbmNlcyBhbmQgbm90IHRoZSBvcmlnaW5hbCBwdWJsaWNhdGlvbnMgYXJlIHRoZSB1bml0IG9mIGFuYWx5c2lzLiBJZGVudGlmaWVkIGtub3dsZWRnZSBiYXNlcyBjYW4gYmUgaW50ZXJwcmV0ZWQgYXMgdGhlIGtub3dsZWRnZSBmb3VuZGF0aW9uIHRoZSBmaWVsZCBkcmF3cyBmcm9tLiBTZWUgYFRlY2huaWNhbCBkZXNjcmlwdGlvbmBmb3IgYWRkaXRpb25hbCBleHBsYW5hdGlvbnMuCgpgYGB7ciwgaW5jbHVkZT1GQUxTRX0KQ19udyA8LSByZWFkUkRTKHBhc3RlMCgnLi4vLi4vdGVtcC9DX253XycsIHN0cl90b19sb3dlcih2YXJfaW5zdCksICdfJywgc3RyX3RvX2xvd2VyKHZhcl9kZXB0KSwgJy5yZHMnKSkgICU+JQogIGRyb3BfbmEoY29tKQpgYGAKCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQpjb21fbmFtZXNfY2l0IDwtIHRpYmJsZSggCiAgY29tID0gMTooQ19udyAlPiUgcHVsbChjb20pICU+JSBuX2Rpc3RpbmN0KCkpLAogIHR5cGUgPSAnS0InLAogIGNvbCA9IGNvbSAlPiUgZ2dfY29sb3Jfc2VsZWN0KHBhbCA9IHBhbF9rYikpICU+JQogIGxlZnRfam9pbihjb21fbGFiZWxzICU+JSBmaWx0ZXIodHlwZSA9PSAnS0InKSAlPiUgc2VsZWN0KGNvbSwgbGFiZWwpLCBieSA9ICdjb20nKSAlPiUKICBtdXRhdGUobGFiZWwgPSBpZmVsc2UoaXMubmEobGFiZWwpLCBwYXN0ZTAoJ0tCICcsIGNvbSwgJzogdW5sYWJlbGVkJyksIGxhYmVsKSkKCiMgIyAxc3QgYWx0ZXJuYXRpdmU6IE51bWJlciB0aGVtIDEtbgojIHBhc3RlKHR5cGUsIDE6KENfbncgJT4lIHB1bGwoY29tKSAlPiUgbl9kaXN0aW5jdCgpKSkKYGBgCgpgYGB7ciwgaW5jbHVkZT1GQUxTRX0KQ19udyAlPD4lIGxlZnRfam9pbihjb21fbmFtZXNfY2l0ICU+JSBzZWxlY3QoY29tLCBsYWJlbCwgY29sKSwgYnkgPSAiY29tIikKYGBgCgpgYGB7ciwgaW5jbHVkZT1GQUxTRX0Ka2Jfc3RhdHMgPC0gQ19udyAlPiUKICBncm91cF9ieShsYWJlbCkgJT4lCiAgc3VtbWFyaXNlKG4gPSBuKCksIGRlbnNpdHlfaW50ID0gKChzdW0oZGdyX2ludCkgLyAobigpICogKG4oKSAtIDEpKSkgKiAxMDApICU+JSByb3VuZCgzKSkgJT4lCiAgcmVsb2NhdGUobGFiZWwsIGV2ZXJ5dGhpbmcoKSkKYGBgCgpgYGB7cn0Ka2Jfc3VtIDwtQ19udyAlPiUgZ3JvdXBfYnkoY29tKSAlPiUgCiAgYXJyYW5nZShjb20sIGRlc2MoZGdyX2ludCkpICU+JQogIG11dGF0ZShuYW1lID0gbmFtZSAlPiUgc3RyX3RydW5jKDE1MCkpICU+JQogIHNsaWNlX21heChvcmRlcl9ieSA9IGRncl9pbnQsIG4gPSAxMCwgd2l0aF90aWVzID0gRkFMU0UpICU+JSAKICB1bmdyb3VwKCkgJT4lCiAgc2VsZWN0KCBuYW1lLCBkZ3JfaW50LCBkZ3IpICU+JQogIGthYmxlKCkgCgpmb3IoaSBpbiAxOm5yb3coY29tX25hbWVzX2NpdCkpewogIGtiX3N1bSA8LSBrYl9zdW0gJT4lCiAgICBwYWNrX3Jvd3MocGFzdGUwKCdLbm93bGVkZ2UgQmFzZSAnLCBpLCAnOiAnLCBjb21fbmFtZXNfY2l0W2ksICdsYWJlbCddLAogICAgICAgICAgICAgICAgICAgICAnICAgKG4gPSAnLCBrYl9zdGF0c1tpLCAnbiddLCAnLCBkZW5zaXR5ID0nLCBrYl9zdGF0c1tpLCAnZGVuc2l0eV9pbnQnXSAlPiUgcm91bmQoMiksICcpJyApLCAKICAgICAgICAgICAgICAoaSoxMC05KSwgIChpKjEwKSwgbGFiZWxfcm93X2NzcyA9ICJiYWNrZ3JvdW5kLWNvbG9yOiAjNjY2OyBjb2xvcjogI2ZmZjsiKSAKICB9CgprYl9zdW0gJT4lCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSwgZm9udF9zaXplID0gMTApCmBgYAoKYGBge3IsIGluY2x1ZGU9RkFMU0V9CmVsXzJtIDwtIHJlYWRSRFMocGFzdGUwKCcuLi8uLi90ZW1wL2VsXzJtXycsIHN0cl90b19sb3dlcih2YXJfaW5zdCksICdfJywgc3RyX3RvX2xvd2VyKHZhcl9kZXB0KSwgJy5yZHMnKSkgJT4lCiAgZHJvcF9uYSgpCmBgYAoKCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQpjaXRfY29tX3llYXIgPC0gZWxfMm0gJT4lCiAgY291bnQoY29tX2NpdCwgUFksIG5hbWUgPSAnVEMnKSAlPiUKICBncm91cF9ieShQWSkgJT4lCiAgbXV0YXRlKFRDX3JlbCA9IFRDIC8gc3VtKFRDKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIGFycmFuZ2UoUFksIGNvbV9jaXQpICU+JQogIGxlZnRfam9pbihjb21fbmFtZXNfY2l0ICwgYnkgPSBjKCdjb21fY2l0JyA9ICdjb20nKSkgJT4lIAogIGNvbXBsZXRlKGxhYmVsLCBQWSwgZmlsbCA9IGxpc3QoVEMgPSAwLCBUQ19yZWwgPSAwKSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMTUsIGZpZy5oZWlnaHQ9Ny41fQpjaXRfY29tX3llYXIgJT4lCiAgcGxvdF9zdW1tYXJ5X3RpbWVsaW5lKHkxID0gVEMsIHkyID0gVENfcmVsLCB0ID0gUFksIHRfbWluID0gUFlfbWluLCB0X21heCA9IFBZX21heCwgYnkgPSBsYWJlbCwgcGFsID0gcGFsX2tiLCBsYWJlbCA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgIHkxX3RleHQgPSAiTnVtYmVyIGNpdGF0aW9ucyByZWNpZXZlZCBhbm51YWxseSIsICB5Ml90ZXh0ID0gIlNoYXJlIG9mIGNpdGF0aW9ucyByZWNpZXZlZCBhbm51YWxseSIpICsKICBwbG90X2Fubm90YXRpb24odGl0bGUgPSBwYXN0ZSgnS25vd2xlZGdlIEJzZXM6JywgdmFyX2luc3QsICdGaWVsZCBhcm91bmQgRGVwdC4nLCB2YXJfZGVwdCwgc2VwID0gJyAnKSwKICAgICAgICAgICAgICAgICAgc3VidGl0bGUgPSBwYXN0ZSgnVGltZWZyYW1lOicsIFBZX21pbiwgJy0nLCBQWV9tYXggLCBzZXAgPSAnICcpLAogICAgICAgICAgICAgICAgICBjYXB0aW9uID0gJ0Fic29sdXRlIGtub3dsZWRnZSBiYXNlIGFwcGVhcmFuY2UgKGxlZnQpLCBSZWxhdGl2ZSBrbm93bGVkZ2UgYmFzZSBhcHBlYXJhbmNlIChyaWdodCknKQpgYGAKCjwhLS0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC0tPgo8IS0tICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAtLT4KPCEtLSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBORVhUIFBBUlQgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLS0+CjwhLS0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC0tPgo8IS0tICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAtLT4KCiMgUmVzZWFyY2ggQXJlYXM6IEJpYmxpb2dyYXBoaWMgY291cGxpbmcgYW5hbHlzaXMKCioqTm90ZToqKiBUaGlzIGFuYWx5c2lzIHJlZmVycyB0aGUgYmlibGlvZ3JhcGhpYyBjb3VwbGluZyBhbmFseXNpcywgd2hlcmUgb3JpZ2luYWwgcHVibGljYXRpb25zIGFyZSB0aGUgdW5pdCBvZiBhbmFseXNpcy4gSWRlbnRpZmllZCByZXNlYXJjaCBhcmVhcyBjYW4gYmUgaW50ZXJwcmV0ZWQgYXMgdGhlIGZpZWxkJ3MgY3VycmVudCByZXNlYXJjaCBmcm9udGllci4gU2VlIGBUZWNobmljYWwgZGVzY3JpcHRpb25gZm9yIGFkZGl0aW9uYWwgZXhwbGFuYXRpb25zLgoKYGBge3IsIGluY2x1ZGU9RkFMU0V9Ck1fYmliIDwtIHJlYWRSRFMocGFzdGUwKCcuLi8uLi90ZW1wL01fYmliXycsIHN0cl90b19sb3dlcih2YXJfaW5zdCksICdfJywgc3RyX3RvX2xvd2VyKHZhcl9kZXB0KSwgJy5yZHMnKSkgJT4lIAogIGFzX3RpYmJsZSgpICU+JQogIGRyb3BfbmEoY29tKQpgYGAKCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQpjb21fbmFtZXNfYmliIDwtIHRpYmJsZSggCiAgY29tID0gMTooTV9iaWIgJT4lIHB1bGwoY29tKSAlPiUgbl9kaXN0aW5jdCgpKSwKICB0eXBlID0gJ1JBJywKICBjb2wgPSBjb20gJT4lIGdnX2NvbG9yX3NlbGVjdChwYWwgPSBwYWxfcmEpKSAlPiUKICBsZWZ0X2pvaW4oY29tX2xhYmVscyAlPiUgZmlsdGVyKHR5cGUgPT0gJ1JBJykgJT4lIHNlbGVjdChjb20sIGxhYmVsKSwgYnkgPSAnY29tJykgJT4lCiAgbXV0YXRlKGxhYmVsID0gaWZlbHNlKGlzLm5hKGxhYmVsKSwgcGFzdGUwKCdSQSAnLCBjb20sICc6IHVubGFiZWxlZCcpLCBsYWJlbCkpCgojICMgMXN0IGFsdGVybmF0aXZlOiBOdW1iZXIgdGhlbSAxLW4KIyBwYXN0ZSh0eXBlLCAxOihNX2JpYiAlPiUgcHVsbChjb20pICU+JSBuX2Rpc3RpbmN0KCkpKQpgYGAKCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQpNX2JpYiAlPD4lIGxlZnRfam9pbihjb21fbmFtZXNfYmliICU+JSBzZWxlY3QoY29tLCBsYWJlbCwgY29sKSwgYnkgPSAiY29tIikKYGBgCgpgYGB7ciwgaW5jbHVkZT1GQUxTRX0KcmFfc3RhdHMgPC0gTV9iaWIgJT4lCiAgZHJvcF9uYShjb20pICU+JQogIGdyb3VwX2J5KGNvbSwgbGFiZWwpICU+JQogIHN1bW1hcmlzZShuID0gbigpLCBkZW5zaXR5X2ludCA9ICgoc3VtKGRncl9pbnQpIC8gKG4oKSAqIChuKCkgLSAxKSkpICogMTAwKSAlPiUgcm91bmQoMykpICU+JQogIHNlbGVjdChjb20sIGxhYmVsLCBldmVyeXRoaW5nKCkpCmBgYAoKYGBge3J9CnJhX3N1bSA8LSBNX2JpYiAlPiUgZ3JvdXBfYnkobGFiZWwpICU+JSAKICBsZWZ0X2pvaW4oTSAlPiUgc2VsZWN0KFhYLCBBVSwgUFksIFRJLCBUQyksIGJ5ID0gJ1hYJykgJT4lCiAgbXV0YXRlKGRncl9zZWxlY3QgPSAoZGdyX2ludCAvIG1heChkZ3JfaW50KSAqIChUQyAvIG1heChUQykpKSApICU+JQogIHNsaWNlX21heChvcmRlcl9ieSA9IGRncl9zZWxlY3QsIG4gPSAxMCwgd2l0aF90aWVzID0gRkFMU0UpICU+JSAKICBtdXRhdGUoVENfeWVhciA9IChUQyAvICgyMDIxICsgMSAtIFBZKSkgJT4lIHJvdW5kKDIpLAogICAgICAgICBkZ3JfaW50ID0gZGdyX2ludCAlPiUgcm91bmQoMiksCiAgICAgICAgIEFVID0gQVUgJT4lIHN0cl90cnVuYygyNSksCiAgICAgICAgIFRJID0gVEkgJT4lIHN0cl90cnVuYygxMjUpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgc2VsZWN0KEFVLCBQWSwgVEksIGRncl9pbnQsIFRDLCBUQ195ZWFyKSAlPiUKICBrYWJsZSgpCgoKZm9yKGkgaW4gMTpucm93KGNvbV9uYW1lc19iaWIpKXsKICByYV9zdW0gICU8PiUKICAgIHBhY2tfcm93cyhwYXN0ZTAoJ1Jlc2VhcmNoIEFyZWEgJywgaSwgJzogJywgY29tX25hbWVzX2JpYltpLCAnbGFiZWwnXSwKICAgICAgICAgICAgICAgICAgICAgJyAgIChuID0gJywgcmFfc3RhdHNbaSwgJ24nXSwgJywgZGVuc2l0eSA9JywgcmFfc3RhdHNbaSwgJ2RlbnNpdHlfaW50J10gJT4lIHJvdW5kKDIpLCAnKScgKSwgCiAgICAgICAgICAgICAgKGkqMTAtOSksICAoaSoxMCksIGxhYmVsX3Jvd19jc3MgPSAiYmFja2dyb3VuZC1jb2xvcjogIzY2NjsgY29sb3I6ICNmZmY7IikgCiAgfQoKcmFfc3VtICU+JSBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpLCBmb250X3NpemUgPSAxMCkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMTUsIGZpZy5oZWlnaHQ9Ny41fQpNX2JpYiAlPiUKICBsZWZ0X2pvaW4oTSAlPiUgc2VsZWN0KFhYLCBQWSksIGJ5ID0gJ1hYJykgJT4lCiAgbXV0YXRlKFBZID0gUFkgJT4lIGFzLm51bWVyaWMoKSkgJT4lCiAgZ3JvdXBfYnkobGFiZWwsIFBZKSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpICU+JSB1bmdyb3VwKCkgJT4lCiAgZ3JvdXBfYnkoUFkpICU+JSBtdXRhdGUobl9QWSA9IHN1bShuKSkgJT4lIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGUobl9yZWwgPSBuIC8gbl9QWSkgJT4lCiAgc2VsZWN0KGxhYmVsLCBQWSwgbiwgbl9yZWwpICU+JQogIGFycmFuZ2UobGFiZWwsIFBZKSAlPiUgCiAgY29tcGxldGUobGFiZWwsIFBZLCBmaWxsID0gbGlzdChuID0gMCwgbl9yZWwgPSAwKSkgJT4lCiAgcGxvdF9zdW1tYXJ5X3RpbWVsaW5lKHkxID0gbiwgeTIgPSBuX3JlbCwgdCA9IFBZLCB0X21pbiA9IFBZX21pbiwgdF9tYXggPSBQWV9tYXgsIGJ5ID0gbGFiZWwsIGxhYmVsID0gVFJVRSwgcGFsID0gcGFsX3JhLAogICAgICAgICAgICAgICAgICAgICAgICB5MV90ZXh0ID0gIk51bWJlciBwdWJsaWNhdGlvbnMgYW5udWFsbHkiLCB5Ml90ZXh0ID0gIlNoYXJlIG9mIHB1YmxpY2F0aW9ucyBhbm51YWxseSIpICsKICBwbG90X2Fubm90YXRpb24odGl0bGUgPSBwYXN0ZSgnUmVzZWFyY2ggQXJlYXM6JywgdmFyX2luc3QsICdGaWVsZCBhcm91bmQgRGVwdC4nLCB2YXJfZGVwdCwgc2VwID0gJyAnKSwKICAgICAgICAgICAgICAgICAgc3VidGl0bGUgPSBwYXN0ZSgnVGltZWZyYW1lOicsIFBZX21pbiwgJy0nLCBQWV9tYXggLCBzZXAgPSAnICcpLAogICAgICAgICAgICAgICAgICBjYXB0aW9uID0gJ0Fic29sdXRlIHJlc2VhcmNoIGFyZWEgYXBwZWFyYW5jZSAobGVmdCksIFJlbGF0aXZlIHJlc2VhcmNoIGFyZWEgYXBwZWFyYW5jZSAocmlnaHQpJykKYGBgCgoKYGBge3IsIGluY2x1ZGU9RkFMU0V9CmdfYWdnIDwtIHJlYWRSRFMocGFzdGUwKCcuLi8uLi90ZW1wL2dfYmliX2FnZ18nLCBzdHJfdG9fbG93ZXIodmFyX2luc3QpLCAnXycsIHN0cl90b19sb3dlcih2YXJfZGVwdCksICcucmRzJykpICVOPiUKICBhcnJhbmdlKGNvbSkgIyAlPiUKIyAgIG11dGF0ZShuYW1lID0gbmFtZXNfcmEgJT4lIHB1bGwoY29tX3JhX25hbWUpLAojICAgICAgICAgIGNvbG9yID0gY29sc19yYSkKYGBgCgpgYGB7ciwgZmlnLmhlaWdodD0gNy41LCBmaWcud2lkdGg9Ny41fQpnX2FnZyAlRT4lIAogIGZpbHRlcih3ZWlnaHQgPiAwICYgZnJvbSAhPSB0bykgJT4lCiAgZmlsdGVyKHdlaWdodCA+PSBxdWFudGlsZSh3ZWlnaHQsIDAuMjUpICkgICVOPiUKICBtdXRhdGUoY29tID0gY29tX25hbWVzX2JpYiAlPiUgcHVsbChsYWJlbCkpICU+JQogIGdncmFwaChsYXlvdXQgPSAiY2lyY2xlIikgKyAKICBnZW9tX2VkZ2VfZmFuKHN0cmVuZ2h0ID0gMC44LCBhZXMod2lkdGggPSB3ZWlnaHQpLCBhbHBoYSA9IDAuMikgICsgCiAgZ2VvbV9ub2RlX3BvaW50KGFlcyhzaXplID0gTiwgY29sb3IgPSBjb20pKSAgKyAKICBnZW9tX25vZGVfdGV4dChhZXMobGFiZWwgPSBjb20pLCByZXBlbCA9IFRSVUUpICsKICAjdGhlbWVfZ3JhcGgoYmFzZV9mYW1pbHkgPSAiQXJpYWwiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ2JvdHRvbScpICsKICBzY2FsZV9zaXplKHJhbmdlID0gYygyLDIwKSkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gcGFsX3JhKSArCiAgbGFicyh0aXRsZSA9IHBhc3RlKCdSZXNlYXJjaCBBcmVhIENvbm5lY3Rpdml0eTonLCB2YXJfaW5zdCwgJ0ZpZWxkIGFyb3VuZCBEZXB0LicsIHZhcl9kZXB0LCBzZXAgPSAnICcpLAogICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9IHBhc3RlKCdUaW1lZnJhbWU6JywgUFlfbWluLCAnLScsIFBZX21heCAsIHNlcCA9ICcgJyksCiAgICAgICAgICAgICAgICAgIGNhcHRpb24gPSAnTm9kZXMgPSBJZGVudGlmaWVkIFJlc2VhcmNoIEFyZWFzOyBFZGdlczogQmlibGlvZ3JhcGhpYyBjb3VwbGluZyBzdHJlbmdodCAoSmFjY2FyZCB3ZWlnaHRlZCknKQpgYGAKCgojIEtub3dsZWRnZSBCYXNlcywgUmVzZWFyY2ggQXJlYXMgJiBUb3BpY3MgSW50ZXJhY3Rpb24KCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQojIE5vZGVzCm5sXzNtIDwtIGNvbV9uYW1lc19iaWIgJT4lCiAgYmluZF9yb3dzKGNvbV9uYW1lc19jaXQpICU+JQogIGJpbmRfcm93cyhjb21fbmFtZXNfdG9wKSAlPiUKICByZW5hbWUobmFtZSA9IGxhYmVsLAogICAgICAgICBjb21fbnIgPSBjb20pICU+JQogIHJlbG9jYXRlKG5hbWUpCgojIEVkZ2VzCmVsXzJtX2tiIDwtIGVsXzJtICU+JQogIHNlbGVjdCgtZnJvbSwgLXRvKSAlPiUKICBpbm5lcl9qb2luKGNvbV9uYW1lc19jaXQgJT4lIHNlbGVjdChjb20sIGxhYmVsKSwgYnkgPSBjKCdjb21fY2l0JyA9ICdjb20nKSkgJT4lCiAgaW5uZXJfam9pbihjb21fbmFtZXNfYmliICU+JSBzZWxlY3QoY29tLCBsYWJlbCwgY29sKSwgYnkgPSBjKCdjb21fYmliJyA9ICdjb20nKSkgJT4lCiAgbXV0YXRlKHdlaWdodCA9IDEpICU+JQogIHJlbmFtZShmcm9tID0gbGFiZWwueCwKICAgICAgICAgdG8gPSBsYWJlbC55KSAlPiUgIyBnZW5lcmljCiAgc2VsZWN0KGZyb20sIHRvLCB3ZWlnaHQsIGNvbCkgJT4lIAogIGRyb3BfbmEoKSAlPiUgCiAgY291bnQoZnJvbSwgdG8sIGNvbCwgd3QgPSB3ZWlnaHQsIG5hbWUgPSAnd2VpZ2h0JykgJT4lCiAgZmlsdGVyKHBlcmNlbnRfcmFuayh3ZWlnaHQpID49IDAuMjUpICU+JQogIHdlaWdodF9qYWNjYXJkKGkgPSBmcm9tLCBqID0gdG8sIHcgPSB3ZWlnaHQpICU+JSAKICBzZWxlY3QoLXdlaWdodCkKCmVsXzJtX3RvcGljIDwtIHRleHRfbGRhX2dhbW1hICU+JSBzZWxlY3QoLXRvcGljLCAtY29sKSAlPiUKICBsZWZ0X2pvaW4oTV9iaWIgJT4lIHNlbGVjdChYWCwgY29tKSAlPiUgZHJvcF9uYShjb20pLCBieSA9IGMoJ2RvY3VtZW50JyA9ICdYWCcpKSAlPiUKICBpbm5lcl9qb2luKGNvbV9uYW1lc19iaWIgJT4lIHNlbGVjdChjb20sIGxhYmVsLCBjb2wpLCBieSA9IGMoJ2NvbScgPSAnY29tJykpICU+JQogIHJlbmFtZShmcm9tID0gbGFiZWwueSwKICAgICAgICAgdG8gPSBsYWJlbC54LAogICAgICAgICB3ZWlnaHQgPSBnYW1tYSkgJT4lICMgZ2VuZXJpYwogIHNlbGVjdChmcm9tLCB0bywgd2VpZ2h0LCBjb2wpICU+JSAKICBkcm9wX25hKCkgJT4lIAogIGNvdW50KGZyb20sIHRvLCBjb2wsIHd0ID0gd2VpZ2h0LCBuYW1lID0gJ3dlaWdodCcpICU+JQogIGZpbHRlcihwZXJjZW50X3Jhbmsod2VpZ2h0KSA+PSAwLjI1KSAlPiUKICB3ZWlnaHRfamFjY2FyZChpID0gZnJvbSwgaiA9IHRvLCB3ID0gd2VpZ2h0KSAlPiUgc2VsZWN0KC13ZWlnaHQpCgojIGdyYXBoCmdfM20gPC0gZWxfMm1fa2IgJT4lIAogIGJpbmRfcm93cyhlbF8ybV90b3BpYykgJT4lCiAgYXNfdGJsX2dyYXBoKGRpcmVjdGVkID0gVFJVRSkgJU4+JQogIGxlZnRfam9pbihubF8zbSwgYnkgPSAnbmFtZScpICU+JQogIG11dGF0ZSgKICAgIGxldmVsID0gY2FzZV93aGVuKAogICAgICB0eXBlID09ICJLQiIgfiAxLAogICAgICB0eXBlID09ICJSQSIgfiAyLAogICAgICB0eXBlID09ICJUUCIgfiAzKSwKICAgIGNvb3JkX3kgPSAwLjEsCiAgICBjb29yZF94ID0gMC4wMDEgKyAxLyhtYXgobGV2ZWwpLTEpICogKGxldmVsLTEpCiAgICApICAlTj4lCiAgZmlsdGVyKCFpcy5uYShsZXZlbCkpCmBgYAoKYGBge3IsIGluY2x1ZGU9RkFMU0V9CiMjIEJ1aWxkIHNhbmtleSBwbG90CmZpZyA8LSBwbG90X2x5KHR5cGUgPSAic2Fua2V5IiwgCiAgICAgICAgICAgICAgIG9yaWVudGF0aW9uID0gImgiLAogICAgICAgICAgICAgICBhcnJhbmdlbWVudCA9ICJzbmFwIiwKICBub2RlID0gbGlzdCgKICAgIGxhYmVsID0gZ18zbSAlTj4lIGFzX3RpYmJsZSgpICU+JSBwdWxsKG5hbWUpLAogICAgeCA9IGdfM20gJU4+JSBhc190aWJibGUoKSAlPiUgcHVsbChjb29yZF94KSwKICAgIHkgPSBnXzNtICVOPiUgYXNfdGliYmxlKCkgJT4lIHB1bGwoY29vcmRfeSksCiAgICBjb2xvciA9IGdfM20gJU4+JSBhc190aWJibGUoKSAlPiUgcHVsbChjb2wpLCAKICAgIHBhZCA9IDQKICApLCAKICBsaW5rID0gbGlzdCgKICAgIHNvdXJjZSA9IChnXzNtICVFPiUgYXNfdGliYmxlKCkgJT4lIHB1bGwoZnJvbSkpIC0xLAogICAgdGFyZ2V0ID0gKGdfM20gJUU+JSBhc190aWJibGUoKSAlPiUgcHVsbCh0bykpIC0xLAogICAgdmFsdWUgPSAgZ18zbSAlRT4lIGFzX3RpYmJsZSgpICU+JSBwdWxsKHdlaWdodF9qYWMpLAogICAgY29sb3IgPSBnXzNtICVFPiUgYXNfdGliYmxlKCkgJT4lIHB1bGwoY29sKSAlPiUgY29sMnJnYigpICU+JSBhcy5tYXRyaXgoKSAlPiUgdCgpICU+JSBhc190aWJibGUoKSAlPiUgCiAgICAgIG11dGF0ZShjb2xfcmdiID0gcGFzdGUwKCdyZ2JhKCcsIHJlZCwgJywnICwgZ3JlZW4sICcsJywgYmx1ZSwgJywwLjc1KScpKSAlPiUgIHB1bGwoY29sX3JnYikKICAgICkKKSAlPiUgCiAgbGF5b3V0KHRpdGxlID0gcGFzdGUoJ0tub3dsZWRnZSBCYXNlcywgUmVzZWFyY2ggQXJlYXMgJiBUb3BpY3M6JywgdmFyX2luc3QsICdGaWVsZCBhcm91bmQgRGVwdC4nLCB2YXJfZGVwdCwgc2VwID0gJyAnKSwKICAgICAgICAgbWFyZ2luID0gbGlzdChsID0gNTAsIHIgPSA1MCwgYiA9IDEwMCwgdCA9IDEwMCwgcGFkID0gMikpIApgYGAKCgojIyBKb2ludCBPdmVydmlldyBvdmVyIEtub3dsZWRnZSBCYXNlcywgUmVzZWFyY2ggQXJlYXMsIGFuZCBUb3BpY3MKClRoaXMgcGxvdCBzaG93cyB0aGUgY29ubmVjdGlvbiBvZiBwdWJsaWNhdGlvbnMgaW4gdGhlIHJlc2VhcmNoIGFyZWFzIHRvIGtub3dsZWRnZSBiYXNlcyAoYnkgY2l0YXRpb25zKSBhbmQgdG9waWNzIChieSBnYW1tYSwgZG9jdW1lbnQtdG9waWMgd2VpZ2h0KQoKYGBge3IsIGZpZy5oZWlnaHQ9IDEwLCBmaWcud2lkdGg9MTV9CmZpZwpgYGAKCgoKIyBUcmVuZHMgCgpgYGB7cn0KdW5pX3NpbSA8LSByZWFkX3JkcyhwYXN0ZTAoJy4uLy4uL3RlbXAvdW5pX3NpbV8nLCBzdHJfdG9fbG93ZXIodmFyX2luc3QpLCAnXycsIHN0cl90b19sb3dlcih2YXJfZGVwdCksICcucmRzJykpCmBgYAoKIyMgTGVhZC1MYWcgQW5hbHlzaXMgCgpgYGB7ciwgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9Ny41fQpkZXNjIDwtIHVuaV9zaW0gJT4lIAogIGZpbHRlcihBVV9VTiA9PSBwYXN0ZSh2YXJfaW5zdCwgdmFyX2RlcHQpKSAlPiUKICBtdXRhdGUoZGVzYyA9IHBhc3RlMCgnTjogJywgbiwgJyBcbicsCiAgICAgICAgICAgICAgICAgICAgICAgJ1NpbWlsYXJpdHkgdG8gcGFzdDonLCBzaW1fcGFzdCAlPiUgcm91bmQoMiksICcgXG4nLAogICAgICAgICAgICAgICAgICAgICAgICdTaW1pbGFyaXR5IHRvIGZ1dHVyZTogJywgc2ltX2Z1dHVyZSAlPiUgcm91bmQoMiksICcgXG4nLAogICAgICAgICAgICAgICAgICAgICAgICdMZWFkLUxhZyBTY29yZTogJywgZnV0dXJlX3RyZW5kICU+JSByb3VuZCgyKSkpICU+JSBwdWxsKGRlc2MpCiAgCiAgCnVuaV9zaW0gJT4lCiAgc2xpY2VfbWF4KG9yZGVyX2J5ID0gbiwgbiA9IDEwMCkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gc2ltX3Bhc3QsIHkgPSBzaW1fZnV0dXJlKSkgKwogIGdlb21fbWFya19lbGxpcHNlKGFlcyhmaWx0ZXIgPSBBVV9VTiA9PSBwYXN0ZSh2YXJfaW5zdCwgdmFyX2RlcHQpLCBsYWJlbCA9IEFVX1VOLCBmaWxsID0gJ3JlZDEnKSwgZGVzY3JpcHRpb24gPSBkZXNjKSArIGd1aWRlcyhmaWxsID0gRkFMU0UpICsKICAjZ2VvbV9wb2ludChkYXRhID0gdW5pX3NpbSAlPiUgZmlsdGVyKEFVX1VOID09IHBhc3RlKHZhcl9pbnN0LCB2YXJfZGVwdCkpLCAKICAjICAgICAgICAgICBhZXMoc2l6ZSA9IG4pLCBjb2wgPSAnZGFya3JlZCcpICsgCiAgZ2VvbV9wb2ludChhZXMoc2l6ZSA9IG4sIGNvbCA9IGZ1dHVyZV90cmVuZCksIGFscGhhID0gMC41KSArCiAgZ2VvbV90ZXh0X3JlcGVsKCAKICAgIGRhdGEgPXVuaV9zaW0gJT4lIHNsaWNlX21heChvcmRlcl9ieSA9IG4sIG4gPSA1KSAlPiUgZmlsdGVyKEFVX1VOICE9IHBhc3RlKHZhcl9pbnN0LCB2YXJfZGVwdCkpLCAjIEZpbHRlciBkYXRhIGZpcnN0CiAgICBhZXMobGFiZWwgPSBBVV9VTiksCiAgICBib3gucGFkZGluZyA9IDEsIG1heC5vdmVybGFwcyA9IEluZikgKwogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sID0gJ3Nub3czJykgKwogIHNjYWxlX2NvbG91cl9ncmFkaWVudChsb3cgPSAiYmx1ZSIsIGhpZ2ggPSAicmVkIiwgbmFtZSA9ICJMZWFkLUxhZyBTY29yZSIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykgKwogIGxhYnMoeCA9ICdTaW1pbGFyaXR5IHRvIHBhc3QnLAogICAgICAgeSA9ICdTaW1pbGFyaXR5IHRvIGZ1dHVyZScsCiAgICAgICB0aXRsZSA9IHBhc3RlKCdGaWVsZCBMZWFkLUxhZyBBbmFseXNpczonLCB2YXJfaW5zdCwgdmFyX2RlcHQsIHNlcCA9ICcgJyksCiAgICAgICBzdWJ0aXRsZSA9IHBhc3RlKCdUaW1lZnJhbWU6JywgUFlfbWluLCAnLScsIFBZX21heCAsIHNlcCA9ICcgJyksCiAgICAgICBjYXB0aW9uID0gJ3ggYW5kIHkgYXhpcycpCiMgKyBsaW1zKHggPSBjKDAuNjI1LCAwLjcyNSksIHkgPSBjKDAuNjI1LCAwLjcyNSkpCmBgYAoKPCEtLSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLS0+CjwhLS0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC0tPgo8IS0tICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIE5FWFQgUEFSVCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAtLT4KPCEtLSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLS0+CjwhLS0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC0tPgoKIyBDb2xsYWJvcmF0aW9uIAoKYGBge3J9CmVsX2luc3QgPC0gcmVhZFJEUyhwYXN0ZTAoJy4uLy4uL3RlbXAvZWxfaW5zdF8nLCBzdHJfdG9fbG93ZXIodmFyX2luc3QpLCAnXycsIHN0cl90b19sb3dlcih2YXJfZGVwdCksICcucmRzJykpCmBgYAoKCmBgYHtyfQpnX2luc3QgPC0gZWxfaW5zdCAlPiUgYXNfdGJsX2dyYXBoKGRpcmVjdGVkID0gRkFMU0UpICVFPiUKICBmaWx0ZXIod2VpZ2h0ID49IGN1dG9mX2VkZ2VfY2l0ICkgJU4+JQogIGZpbHRlcighbm9kZV9pc19pc29sYXRlZCgpKQpgYGAKCiMjIENvbGxhYm9yYXRpb24gbmV0d29yayAKCmBgYHtyLCBmaWcuaGVpZ2h0PSAxMCwgZmlnLndpZHRoPTE1fQpnX2luc3QgJU4+JSAKICBtdXRhdGUoY2VudCA9IGNlbnRyYWxpdHlfZGVncmVlKHdlaWdodHMgPSB3ZWlnaHQpKSAlPiUKICBmaWx0ZXIobmFtZSA9PSBwYXN0ZSh2YXJfaW5zdCwgdmFyX2RlcHQpICB8IHJhbmsoLWNlbnQpIDw9IDEwMCApICU+JQogIGdncmFwaChsYXlvdXQgPSAiZnIiKSArIAogIGdlb21fZWRnZV9saW5rKGFlcyh3aWR0aCA9IHdlaWdodCwKICAgICAgICAgICAgICAgICAgICAgI2NvbG9yID0gLk4oKSRuYW1lW2Zyb21dID09IHBhc3RlKHZhcl9pbnN0LCB2YXJfZGVwdCkgfCAuTigpJG5hbWVbZnJvbV0gPT0gcGFzdGUodmFyX2luc3QsIHZhcl9kZXB0KSwKICAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gKHdlaWdodCA+PSB3ZWlnaHQgICU+JSBxdWFudGlsZSgwLjI1KSkpCiAgICAgICAgICAgICAgICAgLCBhbHBoYSA9IDAuMjUpICArIAogIGdlb21fbm9kZV9wb2ludChhZXMoc2l6ZSA9IGNlbnQpLCBjb2wgPSAnc3RlZWxibHVlMScpICArIAogIGdlb21fbm9kZV90ZXh0KGFlcyhsYWJlbCA9IG5hbWUsIAogICAgICAgICAgICAgICAgICAgICBzaXplID0gY2VudCwKICAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gKGNlbnQgPj0gY2VudCAgJT4lIHF1YW50aWxlKDAuOCkpKSwgcmVwZWwgPSBUUlVFKSArCiAgI3RoZW1lX2dyYXBoKGJhc2VfZmFtaWx5ID0gIkFyaWFsIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKSArCiAgc2NhbGVfZWRnZV93aWR0aF9jb250aW51b3VzKHJhbmdlID0gYygwLjUsIDUpKSAgKwogIHNjYWxlX2VkZ2VfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJncmV5IiwgInJlZCIpLCBuYW1lID0gJzFzdCBkZWdyZWUnKSArCiAgc2NhbGVfc2l6ZShyYW5nZSA9IGMoMC41LDEwKSkgCmBgYAoKIyBFbmRub3RlcwoKYGBge3J9CnNlc3Npb25JbmZvKCkKYGBgCgo=